//
// Created by Administrator on 2018/7/16.
//

#ifndef PHASECHANGE_GW376_H
#define PHASECHANGE_GW376_H

#define GW376_HEAD_68H		0x68
#define GW376_TAIL_16H		0x16

#define GW376_FIRST_68H_POS		0
#define GW376_DATALEN_POS		1
#define GW376_SECOND_68H_POS	5
#define GW376_CTRL_POS			6
#define A1_POS					7
#define A2_POS					9
#define A3_POS					11
#define AFN_POS					12
#define	SEQ_POS					13
#define FIRST_PN_POS			14
#define FIRST_FN_POS			16
#define DATA_START_POS          18


//get ctrl code
#define GDW_CTRLCODE_FUNC	                0x0F
#define GDW_CTRLCODE_FCV	                0x10
#define GDW_CTRLCODE_FCB	                0x20
#define GDW_CTRLCODE_PRM	                0x40
#define GDW_CTRLCODE_DIR	                0x00
#define GDW_CTRLCODE_DFC	                0x10
#define GDW_CTRLCODE_ACD	                0x20

//get seq
#define GDW_SEQ_PRSEQ                       0x0F
#define GDW_SEQ_CON                         0x10
#define GDW_SEQ_FIRFIN                      0x60
#define GDW_SEQ_TPV                         0x80

//seq define
#define GDW_SEQTPV_NONE                     0x0
#define GDW_SEQTPV_NEED                     0x80

#define GDW_SEQFIRFIN_MID                   0x0
#define GDW_SEQFIRFIN_LAST                  0x20
#define GDW_SEQFIRFIN_FIRST                 0x40
#define GDW_SEQFIRFIN_SINGLE                0x60

#define GDW_SEQCON_NONE                     0x0
#define GDW_SEQCON_NEED                     0x10

//链路层长度L低两位为规约标识，D0=0,D1=1表示本规约使用
#define GDW_LINKLEN_LOW2BIT                 0x02

#define AFN_SUREDENY		0x00	// 确认/否认
#define AFN_RESET			0x01	// 复位
#define AFN_LINKCHECK		0x02	// 链路接口检测
#define AFN_FORWARD 		0x03	// 中继站命令
#define AFN_SETPARA			0x04	// 设置参数
#define AFN_CTRL			0x05	// 控制命令
#define AFN_AUTHOR			0x06	// 身份认证及密钥协商
//#define AFN_STANDBY			0x07	// 备用
#define AFN_ASKFORWARD		0x08	// 请求被级联终端主动上报
#define AFN_ASKTERMCONFIG	0x09	// 请求终端配置
#define AFN_ASKPARA			0x0A	// 查询参数
#define AFN_ASKTASKDATA		0x0B	// 请求任务数据
#define AFN_ASKONEDATA		0x0C	// 请求1类数据(实时数据)
#define AFN_ASKTWODATA		0x0D	// 请求2类数据(历史数据)
#define AFN_ASKTHREEDATA	0x0E	// 请求3类数据(事件数据)
#define AFN_FILETRANS		0x0F	// 文件传输
#define AFN_DATATRANS		0x10	// 数据转发

#define TO_ASK				0
#define TO_SET				1

#define INVALID_DATA		0xEE

#ifndef BCD_TO_BIN
#define BCD_TO_BIN(val) ( ((val) & 0xf) + ((val)>>4)*10 )
#endif

#ifndef BIN_TO_BCD
#define BIN_TO_BCD(val) ( (((val)/10)<<4) + (val)%10 )
#endif

typedef struct {
    unsigned short	year;
    unsigned char	month;
    unsigned char   day;
    unsigned char	hour;
    unsigned char	minute;
    unsigned char	second;
    unsigned char   week;
    unsigned short	msecond;
} T_SYSTEMTIME;



/****************************************************
* 函数说明: ctrl_fn003_send 控制换相
*
* 参数说明： mpNo      -- 测量点号
*           fromphase -- 源相位,    1: A相，2: B相，3: C相
*           tophase   -- 目标相位,  1: A相，2: B相，3: C相
*
* 返回值: 报文
****************************************************/
unsigned char *ctrl_fn003_send (unsigned char *termaddr, unsigned char A3, int mpNo,
                                unsigned char fromphase, unsigned char tophase);


/****************************************************
* 函数说明: askOneData_fn179_send 电压不平衡度和电流不平衡度
*
* 参数说明：
*
* 返回值： 报文
****************************************************/
unsigned char *askOneData_fn179_send (unsigned char *termaddr, unsigned char A3);

/****************************************************
* 函数说明: askOneData_fn181_send 换相开关(三相电压、负荷电流、负荷电压、负荷功率因数、负荷电流、电压不平衡度)
*
* 参数说明：mpNo      -- 测量点号
*
* 返回值： 报文
****************************************************/
unsigned char *askOneData_fn181_send (unsigned char *termaddr, unsigned char A3,int mpNo);

/****************************************************
* 函数说明: askTwoData_fn239_send 日冻结换相开关总次数
*
* 参数说明：mpNo      -- 测量点号
*           year      -- 年(18)
*           month     -- 月
*           day       -- 日
*
* 返回值：报文
****************************************************/
unsigned char *askTwoData_fn239_send (unsigned char *termaddr, unsigned char A3,int mpNo,
                                      int year, unsigned char month, unsigned char day);

/****************************************************
* 函数说明: askTwoData_fn240_send 日冻结换相开关总次数
*
* 参数说明：mpNo      -- 测量点号
*           year      -- 年(18)
*           month     -- 月
*
* 返回值: 报文
****************************************************/
unsigned char *askTwoData_fn240_send (unsigned char *termaddr, unsigned char A3,
                                      int mpNo, int year, unsigned char month);

                                      /****************************************************
* 函数说明: askOneData_fn15_recv 解析一类数据 换相开关在线状态
*
* 参数说明:  frame    -- 报文内容
*
* 返回值: 解析出来的数据字符串
****************************************************/
char *askOneData_fn15_recv (unsigned char *frame);
                                      
/****************************************************
* 函数说明: askOneData_fn179_recv 解析一类数据 电压不平衡度和电流不平衡度
*
* 参数说明:  frame    -- 报文内容
*
* 返回值: 解析出来的数据字符串
****************************************************/
char *askOneData_fn179_recv (unsigned char *frame);

/****************************************************
* 函数说明: askOneData_fn181_recv 解析一类数据   换相开关(三相电压、负荷电流、负荷电压、负荷功率因数、负荷电流、电压不平衡度)
*
* 参数说明:  frame    -- 报文内容
*
* 返回值: 解析的数据字符串
****************************************************/
char *askOneData_fn181_recv (unsigned char *frame);

/****************************************************
* 函数说明: askTwoData_fn239_recv 解析二类数据 日冻结换相开关动作次数
*
* 参数说明:  frame    -- 报文内容
*
* 返回值： 解析数据的字符串
****************************************************/
char *askTwoData_fn239_recv (unsigned char *frame);

/****************************************************
* 函数说明: askTwoData_fn240_recv 解析二类数据 月冻结换相开关动作次数
*
* 参数说明:  frame    -- 报文内容
*
* 返回值：解析数据的字符串
****************************************************/
char *askTwoData_fn240_recv (unsigned char *frame);


/****************************************************
* 函数说明: get_datalen 获取数据域长度
*
* 参数说明:  buf    -- 报文内容
****************************************************/
int get_datalen (unsigned char *buf);

/****************************************************
* 函数说明: get_framelen 获取报文长度
*
* 参数说明:  buf    -- 报文内容
****************************************************/
int get_framelen (unsigned char *buf);

/****************************************************
* 函数说明: is_ctrl_ok 解析二类数据 月冻结换相开关动作次数
*
* 参数说明:  frame    -- 报文内容
*
* 返回值：1--接收的报文是控制命令的确认帧，0--接收报文不是控制命令的确认帧
****************************************************/
unsigned char is_ctrl_ok (unsigned char *frame);


/****************************************************
* 函数说明: parse_recv_frame 解析接收的报文
*
* 参数说明:  frame    -- 报文内容
*
* 返回值：解析的数据字符串
****************************************************/
char *parse_recv_frame (unsigned char *frame);

#endif //PHASECHANGE_GW376_H
